package com.system.util;

import com.alibaba.fastjson.JSONObject;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Classname FormulaUtils
 * @Description TODO
 * @Date 2023/10/26 12:50
 * @Created by XiongXiong
 * @Author: X.I.O
 *
 * 公式计算工具
 */
public class FormulaUtils {

    /**
     * 格式化vue类似的变量
     * @return
     */
    public static String formatVueVariable(List<String> list,String formulaStr,String ext){
        ext= ext==null?"":ext;
        String variable="";
        for(String str : list){
            if(formulaStr.contains(str)){
                String str1=ext+""+str;
                formulaStr=formulaStr.replaceAll(str,str1);
            }
        }
        return formulaStr;
    }

//    public static void main(String[] args) {
//        List<String> strings=new ArrayList<>();
//        strings.add("ac");
//        strings.add("ab");
//        String str="(ac+ab)*ab";
//        String s=formatVueVariable(strings,str,"this.");
//        System.out.println(s);
//    }

    public static Object count(Map<String,Object> map,String formulaStr){
        // 获取一个脚本引擎
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        try {
            // 设置字段数据为脚本引擎的上下文变量
            map.forEach((k,v)->{
                engine.put(k,v);
            });
            // 执行公式字符串，得到计算结果
            Object result = engine.eval(formulaStr);
            return result;
        } catch (ScriptException e) {
            e.printStackTrace();
        }
        return 0;
    }

    public static Object count(JSONObject json,String formulaStr){
        // 获取一个脚本引擎
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        try {
            // 设置字段数据为脚本引擎的上下文变量
            json.forEach((k,v)->{
                engine.put(k,v);
            });
            // 执行公式字符串，得到计算结果
            Object result = engine.eval(formulaStr);
            return result;
        } catch (ScriptException e) {
            e.printStackTrace();
        }
        return 0;
    }


}
